package SistemaDAOS;

import Herramientas.Herramientas;
import Herramientas.PasarelaDatos;
import Herramientas.ResultSets;
import SistemaDTOS.UsersDTO;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Mauricio Alan
 */
public class UsersDAO {

    private PasarelaDatos db;
    private ResultSets res;

    public UsersDAO() {
        db = new PasarelaDatos();
        res = new ResultSets();

    }

    /**
     * METODO QUE PERMITE LA BUSQUEDA DE UN USURIO EN BASE DE DATOS
     *
     * @param users
     * @return
     */
    public int loginUsuario(UsersDTO users) {
        int banderaAcceso = 0;

        db.openDatabase();
        String query = " select * from users where name = '" + users.getName() + "' and pass = '" + users.getPass() + "'";
        ResultSet rst = null;
        rst = db.executeQuery(query);
        try {
            if (rst.next()) {
                banderaAcceso = 1;
            } else {
                banderaAcceso = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(UsersDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return banderaAcceso;
    }

    /**
     * ALAN GONZALEZ -- METODO PARA OBTENER EL ID DE UN USUARIO SEGUN SU NICH Y
     * SU PASSWORD
     *
     * @param users
     * @return
     */
    public int idUsuario(UsersDTO users) {
        int id = 0;
        db.openDatabase();
        String query = " select * from users where name = '" + users.getName() + "' and pass = '" + users.getPass() + "'";
        ResultSet rst = null;
        rst = db.executeQuery(query);
        try {
            if (rst.next()) {
                id = rst.getInt("id");
            } else {
                id = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(UsersDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return id;
    }

    /**
     * Alan Gonzalez Busca en la tabla de usuarios registrados el username
     * proporcionado
     *
     * @param username
     * @return
     */
    public int BuscarUsername(String username) {
        int bandera = 0;
        db.openDatabase();
        ResultSet rst = null;
        String query = " select * from users where name='" + username + "'";
        rst = db.executeQuery(query);
        try {
            if (rst.next()) {
                bandera = 1;
            } else {
                bandera = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(UsersDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return bandera;
    }

    /**
     * Alan Gonzalez Busca Si Existe Un Email Preexistente en la tabla de
     * usuarios
     *
     * @param email
     * @return
     */
    public int BuscarEmail(String email) {
        int bandera = 0;
        db.openDatabase();
        String query = " select * from users where email ='" + email + "'";
        ResultSet rst = null;
        rst = db.executeQuery(query);
        try {
            if (rst.next()) {
                bandera = 1;
            } else {
                bandera = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(UsersDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return bandera;
    }

    /**
     * alan gonzalez Metodo de registro de Nuevo Usuario
     *
     * @param user
     * @param password
     * @param email
     */
    public void nuevoUsuario(String user, String password, String email) {
        db.openDatabase();
        Herramientas h = new Herramientas();
        String query = "insert into users set";
        query += "  name ='" + user + "' ";
        query += ", pass ='" + h.encriptaMD5(password) + "' "; // 
        query += ", email ='" + email + "'";
        db.execute(query);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ METODO QUE DEVUELVE EL RECORD COMPLETO DE UN USUARIO SEGUN
     * SU ID
     *
     * @param id
     * @return
     */
    public UsersDTO userPorID(int id) {
        UsersDTO user = new UsersDTO();
        String query = "select * from users where id = " + id;
        db.openDatabase();
        ResultSet rst = db.executeQuery(query);
        try {
            if (rst.next()) {
                user = res.usersDTO(rst);
            } else {
                user = null;
            }
        } catch (SQLException ex) {
            Logger.getLogger(UsersDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return user;
    }

    /**
     * ALAN GONZALEZ DEVULEVE
     *
     * @return
     */
    public Vector todoUsuario() {
        Vector v = new Vector();
        String query = "SELECT * FROM users ";
        db.openDatabase();
        ResultSet rst = db.executeQuery(query);
        try {
            while (rst.next()) {
                UsersDTO user = new UsersDTO();
                user = res.usersDTO(rst);
                v.add(user);
            }
        } catch (SQLException ex) {
            Logger.getLogger(UsersDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return v;
    }

    /**
     * ALAN GONZALEZ SE OBTIENEN LOS USUARIOS CON UN EMAIL PARECIDO
     *
     * @param mail
     * @return
     */
    public Vector usuarioPorMail(String mail) {
        Vector u = new Vector();
        String qyery = "SELECT * FROM users WHERE users.email LIKE '%" + mail + "%';";
        db.openDatabase();
        ResultSet rst = db.executeQuery(qyery);
        try {
            while (rst.next()) {
                UsersDTO user = new UsersDTO();
                user = res.usersDTO(rst);
                u.add(user);
            }
        } catch (SQLException ex) {
            Logger.getLogger(UsersDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return u;
    }

    /**
     * ALAN GONZALEZ METODO PARA OBTENER USUARIOS SEGUN SU NOMBRE DE USUARIO
     *
     * @param nombreUsuario
     * @return
     */
    public Vector usuarioPorNombre(String nombreUsuario) {
        Vector u = new Vector();
        String query = "SELECT * FROM users WHERE users.name LIKE '%" + nombreUsuario + "%';";
        db.openDatabase();
        ResultSet rst = db.executeQuery(query);
        try {
            while (rst.next()) {
                UsersDTO user = new UsersDTO();
                user = res.usersDTO(rst);
                u.add(user);
            }
        } catch (SQLException ex) {
            Logger.getLogger(UsersDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return u;
    }

    public Vector usuarioPorEmailNombre(String email, String nombre) {
        Vector users = new Vector();
        String query = "SELECT * FROM users "
                + "WHERE users.name LIKE '%" + nombre + "%' "
                + "AND users.email LIKE '%" + email + "%'";
        db.openDatabase();
        ResultSet rst = db.executeQuery(query);
        try {
            while (rst.next()) {
                UsersDTO user = new UsersDTO();
                user = res.usersDTO(rst);
                users.add(user);
            }
        } catch (SQLException ex) {
            Logger.getLogger(UsersDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return users;
    }

    /**
     * MAURICIO ALAN METODO QUE DEVUELVE EL ULTIMO ID REGISTRADO
     *
     * @return
     */
    public int ultimoIDRegistrado() {
        int ultimoID = 0;
        String query = "SELECT MAX(users.id) AS ultimoIDUsers FROM users";
        db.openDatabase();
        ResultSet rst = db.executeQuery(query);
        try {
            if (rst.next()) {
                ultimoID = rst.getInt("ultimoIDUsers");
            } else {
                ultimoID = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(UsersDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return ultimoID;
    }

    /**
     *  ALAN GONZALEZ - METODO QUE PERMITE EL CAMBIO DE USUARIO
     *  PARA INABILITAR EL LOGIN DE UN USUARIO
     * @param id
     */
    public void cambiarEstadoUsuario(int id, int flag) {
        db.openDatabase();
        String query = "UPDATE  users SET estado="+flag+" WHERE id = " + id;
        db.execute(query);
        db.closeDatabase();
    }
}
